/*******************************************************************************
  * @file                   delay.c
  * @Author:                MQjehovah                 mail:MQjehovah@hotmail.com
  * @version                1.0.1
  * @date                   2017.5.15
  * @brief                  添加sysTick延时
  ******************************************************************************
  * @attention
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "delay.h"
#include "stdio.h"
#include <stdint.h>
#include "USART.h"
/* Definition ----------------------------------------------------------------*/
u16 TimeTick;
volatile u32 sys_Time;
void (*SysTick_CB)(void);
/* Functions -----------------------------------------------------------------*/
/*******************************************************************************
  * @brief  初始化时钟
  * @param  None
  * @retval None
  * @Note   PLL=8MHz * N/ (M*P)=8MHz* 336 /(8*2) = 168MHz
            SystemCoreClock = 168M
            SysTick_CLK= HCLK/8 =21M
            ReLoad = 21 * 1000
*******************************************************************************/
void SysTick_init()
{
    if (SysTick_Config(21000)) //系统滴答时钟1ms
        while (1)
            ;
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
}
/*******************************************************************************
  * @brief  绑定滴答时钟事件
  * @param  None
  * @retval None
  * @Note   None
*******************************************************************************/
void SysTick_BindHandle(void (*pCB)(void))
{
    SysTick_CB = pCB;
}
/*******************************************************************************
  * @brief  清除滴答时钟事件绑定
  * @param  None
  * @retval None
  * @Note   None
*******************************************************************************/
void SysTick_ClearBind()
{
    SysTick_CB = NULL;
}
/*******************************************************************************
  * @brief  精确ms延时
  * @param  None
  * @retval None
  * @Note   None
*******************************************************************************/
void delay_ms(u32 nTime)
{
    u32 start = sys_Time;
    while (sys_Time - start < nTime)
        ;
}

/*******************************************************************************
  * @brief  时钟中断
  * @param  None
  * @retval None
  * @Note   None
*******************************************************************************/
void SysTick_Handler(void)
{
    sys_Time++; //系统计时
    if (SysTick_CB != NULL)
    {
        (*SysTick_CB)();
    }
}
/*******************************************************************************
  * @brief  粗略微秒级延时
  * @param  None
  * @retval None
  * @Note   None
*******************************************************************************/
void simple_delay_us(u16 us)
{
    volatile u16 i, k;
    for (i = 0; i < us; i++)
        for (k = 0; k < 10; k++)
            ;
}
/*******************************************************************************
  * @brief  粗略毫秒级延时
  * @param  None
  * @retval None
  * @Note   None
*******************************************************************************/
void simple_delay_ms(u16 ms)
{
    volatile u16 i, k;
    for (i = 0; i < ms; i++)
        for (k = 0; k < 4000; k++)
            ;
}

/*********************************END OF FILE**********************************/
